package com.huluobo.a2207douyindemo.pay;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.widget.CheckBox;
import android.widget.Toast;

import androidx.recyclerview.widget.GridLayoutManager;

import com.alipay.sdk.app.PayTask;
import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.huluobo.a2207douyindemo.R;
import com.huluobo.a2207douyindemo.adapter.PayAdapter;
import com.huluobo.a2207douyindemo.databinding.ActivityPayBinding;
import com.huluobo.a2207douyindemo.pay.pay.PayResult;
import com.huluobo.a2207douyindemo.pay.pay.util.OrderInfoUtil2_0;
import com.huluobo.base.bean.Money;
import com.huluobo.base.db.AppDBUtils;
import com.huluobo.base.mvvm.BaseActivity;
import com.huluobo.base.net.Const;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class PayActivity extends BaseActivity<ActivityPayBinding> {
    private PayAdapter payAdapter;
    /**
     * 用于支付宝支付业务的入参 app_id。
     */
    public static final String APPID =
            "2021000118655415";

    /**
     * 用于支付宝账户登录授权业务的入参 pid。
     */
    public static final String PID = "";

    /**
     * 用于支付宝账户登录授权业务的入参 target_id。
     */
    public static final String TARGET_ID = "";

    /**
     * pkcs8 格式的商户私钥。
     * <p>
     * 如下私钥，RSA2_PRIVATE 或者 RSA_PRIVATE 只需要填入一个，如果两个都设置了，本 Demo 将优先
     * 使用 RSA2_PRIVATE。RSA2_PRIVATE 可以保证商户交易在更加安全的环境下进行，建议商户使用
     * RSA2_PRIVATE。
     * <p>
     * 建议使用支付宝提供的公私钥生成工具生成和获取 RSA2_PRIVATE。
     * 工具地址：https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
     */
    public static final String RSA2_PRIVATE =
            "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCpf4lEigXwChQW6OPYC4lhgBNOI25JVMgnr0DWHHfSha3SqskPDCGs" +
                    "/Qk8f4WVjregCgbiD6sAX4UBi50srJULiDytlKjyKVhmEe4ZTw3xG/cJ/lfQZ2/aC46tD5eFEXDh" +
                    "/7shGiQEflDZBXJ4amaicBCNTcISz6fxaRWtab5DbWqMvZBX2xOr0gUzu6l1RE//tXMtyJD3yyVM6" +
                    "/A5zIeReqSfzrok1ZAW1GhRLsvZJPpvY+v95UE2fXUt8y3piFxvheRGQ7I5RVNW4/8TGJ7RemnNOyaT3c/aDnNUNq" +
                    "/wKFZ0UAm8rf2/WYeHcLATXIjk3wSl0LzehEG6l3qTabeFAgMBAAECggEAYToIKmml+Eg/t9iFgdM0TdpiuIq4Y5YfbiwoW" +
                    "+lejkMiL1rKFDiYRJutJafcn6qLCGFYC2qDY6ZnLDjCwvKIWGIgtE03EBnJXFtiod/oFms9LN1Zz/DVh1Tj1b" +
                    "/A4ZLclrbTx6wwBufSRnrKa+pUz07LH9L/xTyakG8AAUZL3m693DRUXbvC7QdzBaIWY6wvVMM/3Gv4L2KK/dd7DOTzzkn1GB" +
                    "+g1BNYtJW1LuZUUDkEYKaHps98U+rH0xf63AlRRdjCp1la8Wso+9y2B+Wrrg3QpTzmwVXo4f2nQgYTNhyD3XTN/scN" +
                    "+vSb28UyS4EnGBv89UmtaNc8bKAVaF4IDQKBgQD1j/fznQt4iPdubS2w5FcdP2cXqj0EC0S2+M4ncYeimN" +
                    "/Ag0kZnFz7rVFoYfX6RFLlxtRpWjN764+rHpO6mTdNdWFSbqrFj3yXtomcJzGtERPrPB6zT2Gy60UjPh0I5sC9QX" +
                    "+NMtVkxlAdfw5BBPbLfksUeSQcjXizLF2S/GlLJwKBgQCws+RzJ9WrRRrAFwgjYzxgIcU+wiYIca91Ew8vVAT1no" +
                    "+ayjwIvQOaVI/g7OczuFhRWXV1+kzcyJ9+AmGRkAqU/hCnjQ62Eh2z3PLUsfP0MrnzRcAaWAR9r9ANhd+m6bNBVsP10Q/57" +
                    "+oapgmNWSG2gCekTg0w4nhqiiMJhRiDcwKBgQCnquGWSUinyH2JvKpR+dcxdTUjB24Z8Me+VywL6oy" +
                    "+DLvaasni3szuW20WZKzbcQNZOOWX+arllfXG1V3xLuR/0wHckwuvUUW1IUHciTZ2AQ8ksywTKsR" +
                    "+sf3HDoYsqcI4dxxsgKUL5gyV10cYRhds4pLJK93oUQB09nn9" +
                    "/rK2SQKBgCmLIbqxMtsBdDiVMaSgQCGZzvXiT27My6OKx5co+cGFdd2+jj6/sYknOGx5RiIyxRDbJ3KFVmzR" +
                    "/i1yAd5nLxW4ZdH+p+bGe5U97Rl0fRZ8lptLWs7WwreKDjAfuWVUrIBAFfJFJKxua2u4faZtvi9aEfffIdrMY" +
                    "+ModvRWBl1hAoGBAN2aTPLeKIhyKNg/8IIYcST7ixgCHLnT2fxmK7qnKd4Y0QtqMyQM+xwA5A89xUU8b8Q" +
                    "/+Z11UkM5ysh74dFR6R7Oha9Lw8V2ovx6vQLOATEK28X7FIBsolBPwMjAn572QN9eAP+uRe5Yu2KfiX6ez8D61rEFee" +
                    "+3AtnRHumDJokr";
    public static final String RSA_PRIVATE = "";

    private static final int SDK_PAY_FLAG = 1;
    private static final int SDK_AUTH_FLAG = 2;

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    /**
                     * 对于支付结果，请商户依赖服务端的异步通知结果。同步通知结果，仅作为支付结束的通知。
                     */
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功，需要依赖服务端的异步通知。
//                        ToastUtils.showShort("支付成功");
                        Toast.makeText(PayActivity.this, "支付成功", Toast.LENGTH_SHORT).show();
                    } else {
                        // 该笔订单真实的支付结果，需要依赖服务端的异步通知。
//                        ToastUtils.showShort("支付失败" + payResult);
                        Toast.makeText(PayActivity.this, "支付成功,充值" + sum + "元", Toast.LENGTH_SHORT).show();
                        float newMoney = sum + money.getMoney();
                        money.setMoney(newMoney);
                        AppDBUtils.getInstance().getMoneyDao().updateMoney(money);
                        //跳转支付成功
                        Intent intent = new Intent(PayActivity.this, PaySuccessActivity.class);
                        startActivity(intent);
                        finish();
                    }
                    break;
                }

                default:
                    break;
            }
        }
    };

    /**
     * 支付宝支付业务示例
     */
    public void pay() {
        if (TextUtils.isEmpty(APPID) || (TextUtils.isEmpty(RSA2_PRIVATE) && TextUtils.isEmpty(RSA_PRIVATE))) {
            return;
        }

        /*
         * 这里只是为了方便直接向商户展示支付宝的整个支付流程；所以Demo中加签过程直接放在客户端完成；
         * 真实App里，privateKey等数据严禁放在客户端，加签过程务必要放在服务端完成；
         * 防止商户私密数据泄露，造成不必要的资金损失，及面临各种安全风险；
         *
         * orderInfo 的获取必须来自服务端；
         */
        boolean rsa2 = (RSA2_PRIVATE.length() > 0);
        Map<String, String> params = OrderInfoUtil2_0.buildOrderParamMap(APPID, rsa2);
        String orderParam = OrderInfoUtil2_0.buildOrderParam(params);

        String privateKey = rsa2 ? RSA2_PRIVATE : RSA_PRIVATE;
        String sign = OrderInfoUtil2_0.getSign(params, privateKey, rsa2);
        final String orderInfo = orderParam + "&" + sign;

        final Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(PayActivity.this);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };

        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    private List<Money> moneyList = new ArrayList<>();
    private float sum;
    private Money money;

    @Override
    protected void initData() {
        moneyList.add(new Money(6f, ""));
        moneyList.add(new Money(18f, ""));
        moneyList.add(new Money(30f, ""));
        moneyList.add(new Money(128f, ""));
        moneyList.add(new Money(328f, ""));
        moneyList.add(new Money(648f, ""));
        payAdapter.getData().addAll(moneyList);
        payAdapter.notifyDataSetChanged();
        money = AppDBUtils.getInstance().getMoneyDao()
                .queryUserMoneyByName(SPUtils.getInstance().getString(Const.PARAM_USERNAME));
    }

    @Override
    protected void initView() {
        binding.payHeader.headerTitle.setText("充值");
        binding.payHeader.headerBack.setOnClickListener(v -> finish());

        binding.payRv.setLayoutManager(new GridLayoutManager(this, 3));
        payAdapter = new PayAdapter();
        binding.payRv.setAdapter(payAdapter);

        payAdapter.addChildClickViewIds(R.id.item_pay_cb);
        payAdapter.setOnItemChildClickListener((adapter, view, position) -> {
            CheckBox checkBox = (CheckBox) adapter.getViewByPosition(position, R.id.item_pay_cb);
            if (checkBox.isChecked()) {
                //如果cb选中,把选中的结果相加
                sum += payAdapter.getData().get(position).getMoney();
            } else {
                sum -= payAdapter.getData().get(position).getMoney();
            }
        });

        binding.payBtn.setOnClickListener(v -> {
            if (sum != 0) {
                pay();
            } else {
                ToastUtils.showLong("请选择一个金额");
            }
        });

        binding.payCancelBtn.setOnClickListener(v -> {
            Intent intent = new Intent(this, PayFailedActivity.class);
            startActivity(intent);
            finish();
        });
    }

    @Override
    protected int getLayoutId() {
        return R.layout.activity_pay;
    }
}